
/**
 *  输出红黑树中所有节点的值,颜色,以及它们的孩子状态,输出格式如下:
 *  节点的值;节点的颜色("红"/"黑");节点的孩子信息,当节点不存在孩子时,
 *  输出"0";当节点有2个孩子时,输出"2";否则输出"左"/"右".
 */
void  print_rb_tree(const IntRbTree &rb_tree){
    if(rb_tree._M_impl._M_header._M_parent == 0)
        puts("空");
    else{
        std::queue<IntRbTree::_Link_type> ptr_queue;
        ptr_queue.push(static_cast<IntRbTree::_Link_type>
            (rb_tree._M_impl._M_header._M_parent));
        ptr_queue.push(0); // 表示红黑树中一层的结束,参考 mygumbo.h
        while(!ptr_queue.empty()){
            IntRbTree::_Link_type tmp = ptr_queue.front();
            ptr_queue.pop();
            if(tmp == 0)
                putchar('\n');
            else{
                int child_num = 0;
                // 只在 child_num==1时有效,若为真,则表明孩子是左孩子,否则右孩子
                bool is_left_child;
                if(tmp->_M_left){
                    ptr_queue.push(static_cast<IntRbTree::_Link_type>
                        (tmp->_M_left));
                    ++child_num;
                    is_left_child = true;
                }
                if(tmp->_M_right){
                    ptr_queue.push(static_cast<IntRbTree::_Link_type>
                        (tmp->_M_right));
                    ++child_num;
                    is_left_child = false;
                }
                printf("%d;%s;",
                    *tmp->_M_valptr(),
                    tmp->_M_color==std::_S_red?"红":"黑");
                if(child_num != 1)
                    printf("%d",child_num);
                else
                    fputs(is_left_child ? "左" : "右",stdout);
                fputs("   ",stdout);
                if(ptr_queue.front() == 0)
                    ptr_queue.push(0);
            }
        }
    }
    return ;
}
